﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Prototipo.control;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloUsuarios;

namespace SIGEB.Prototipo.Control
{
    public class controlTipoUsuario
    {
        #region "constructores"

        public controlTipoUsuario(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "validación"

        internal bool nombreValido(string nombre)
        {
            return Validacion.LongitudCadenaValida(nombre, true, 0);
        }

        internal bool codValido(string cod)
        {
            return Validacion.LongitudCadenaValida(cod, true, 0);
        }

        internal bool descripcionValida(string descripcion)
        {
            return Validacion.LongitudCadenaValida(descripcion, false, 0);
        }

        internal bool idTipoPerfilValido(string idTipoPerfil)
        {
            return Validacion.LongitudCadenaValida(idTipoPerfil, true, 0);
        }

        internal bool camposAgregarValidos(string nombre,string descripcion, string idTipoPerfil)
        {
            return nombreValido(nombre) && descripcionValida(descripcion) && idTipoPerfilValido(idTipoPerfil); 
        }

        internal bool camposModificarValidos(string nombre, string descripcion, string idTipoPerfil)
        {
            return nombreValido(nombre) && descripcionValida(descripcion) && idTipoPerfilValido(idTipoPerfil); 
        }



        #endregion

        #region "métodos"

        internal void crearTipoUsuario(string nombre, string descripcion, string idTipoPerfil)
        {
            if (!camposAgregarValidos(nombre, descripcion, idTipoPerfil))
            {
                throw new Exception("Campos inválidos");
            }
            if (!cp.usuarioActualPuede(acciones.TIPUSR_AGREGAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            cp.datos.tiposUsuario.agregartipoUsuario(new tipoUsuario(null, nombre, descripcion, idTipoPerfil));
        }

        internal void modificarTipoUsuario(tipoUsuario editando)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_MODIFICAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!camposModificarValidos(editando.nombre, editando.descripcion, editando.idTipoPerfil))
            {
                throw new Exception("Campos del tipo perfil inválidos");
            }
            cp.datos.tiposUsuario.modificartipoUsuario(editando.codTipoUsuario, editando);
        }

        internal void eliminarTipoUsuario(tipoUsuario eliminando)
        {
            if (!cp.usuarioActualPuede(acciones.TIPUSR_ELIMINAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (eliminando != null)
            {
                cp.datos.tiposUsuario.eliminartipoUsuario(eliminando.codTipoUsuario);
            }
        }

        internal LinkedList<tipoUsuario> obtenerTiposUsuario()
        {
            if (!cp.usuarioActualPuede(acciones.TIPUSR_CONSULTAR))
            {
                return null;
            }
            return cp.datos.tiposUsuario.obtenertipoUsuario();
        }

        internal tipoUsuario obtenerTipoUsuario(string codigo)
        {
            if (!cp.usuarioActualPuede(acciones.TIPUSR_CONSULTAR))
            {
                return null;
            }
            if (codigo == null)
            {
                throw new Exception("El código no puede ser nulo");
            }
            return cp.datos.tiposUsuario.obtenertipoUsuario(codigo);
        }

        internal LinkedList<tipoPerfil> obtenerTiposPerfiles()
        {
            if (!cp.usuarioActualPuede(acciones.TIPUSR_CONSULTAR))
            {
                return null;
            }
            return cp.datos.tipoPerfiles.obtenerPerfiles();
        }

        #endregion

        #region "atributos"

        controlPrincipal cp;

        #endregion
    }
}
